import { AxiosError } from 'axios'
import router from '~/router'
import { useMetaTitle } from '~/composables/meta-title'
import { setRouteEmitter } from '~@/utils/route-listener'


const allowList = ['/login', '/register', '/error', '/401', '/404', '/403']
const loginPath = '/login'

// 用于防止重复加载动态路由
let isAddingRoutes = false

router.beforeEach(async (to, _, next) => {
  setRouteEmitter(to)
  
  // 获取
  const userStore = useUserStore()
  const token = useAuthorization()
  
  // 如果是允许的路径，直接通过
  if (allowList.includes(to.path) || to.path.startsWith('/redirect')) {
    next()
    return
  }
  
  if (!token.value) {
    // 如果没有token，跳转到登录页面
    next({
      path: loginPath,
      query: {
        redirect: encodeURIComponent(to.fullPath),
      },
    })
    return
  }
  
  // 检查动态路由是否已添加（通过检查路由是否存在）
  // 使用 try-catch 因为 hasRoute 在某些情况下可能抛出错误
  let hasDynamicRoute = false
  try {
    hasDynamicRoute = router.hasRoute('Link') || router.hasRoute('DashboardAnalysis') || router.hasRoute('ROOT_EMPTY_PATH')
  } catch (e) {
    // 如果检查失败，假设路由未添加
    hasDynamicRoute = false
  }
  
  // 检查当前匹配的路由是否是404路由（说明动态路由还没添加就被404匹配了）
  const isMatched404 = to.name === 'NotFound' || (to.matched.length > 0 && to.matched[to.matched.length - 1]?.name === 'NotFound')
  
  // 如果是动态路由路径但路由未添加，或者匹配到了404路由，需要先添加路由
  const isDynamicRoutePath = to.path.startsWith('/dashboard') || to.path.startsWith('/form') || to.path.startsWith('/link')
  // 如果路由未添加，且是动态路由路径或匹配到404，则需要添加路由
  const needAddRoutes = !hasDynamicRoute && (isDynamicRoutePath || isMatched404)
  
  // 如果需要添加路由（路由未添加且是动态路由路径或匹配到404）
  if (needAddRoutes && !isAddingRoutes) {
    isAddingRoutes = true
    try {
      // 如果有token但没有用户信息，先获取用户信息
      if (!userStore.userInfo) {
        await userStore.getUserInfo()
      }
      
      // 生成并添加动态路由
      const currentRoute = await userStore.generateDynamicRoutes()
      router.addRoute(currentRoute)
      
      // 重置标志
      isAddingRoutes = false
      
      // 重新导航到当前路由，让动态路由匹配
      next({
        path: to.path,
        replace: true,
      })
      return
    }
    catch (e) {
      isAddingRoutes = false
      if (e instanceof AxiosError && e?.response?.status === 401) {
        // 跳转到error页面
        next({
          path: '/401',
        })
        return
      }
      console.error('Failed to generate dynamic routes:', e)
      // 如果生成路由失败，跳转到登录页
      next({
        path: loginPath,
      })
      return
    }
  }
  
  // 如果当前匹配的是404路由，但动态路由已添加，说明路径确实不存在
  // 但如果是动态路由路径（如 /dashboard/analysis），应该重新匹配
  if (isMatched404 && hasDynamicRoute && isDynamicRoutePath) {
    // 重新导航，让动态路由匹配
    next({
      path: to.path,
      replace: true,
    })
    return
  }
  
  // 如果当前是登录页面就跳转到首页
  if (to.path === loginPath) {
    next({
      path: '/dashboard/analysis',
    })
    return
  }
  // 不需要对注册页做特殊处理，因为它已经在allowList中
  
  next()
})

router.afterEach((to) => {
  useMetaTitle(to)
  
  useLoadingCheck()
  useScrollToTop()
})
